package common

import (
	"fmt"
	"strings"
	"time"
)

// GetNowTime 获取当前时间的字符串格式 (YYYY-MM-DD HH:mm:ss)
func GetNowTime() string {
	return time.Now().Format("2006-01-02 15:04:05")
}

// GetDuration 计算两个时间字符串之间的持续时间
func GetDuration(startStr, endStr, layout string) (string, error) {
	startTime, err := time.Parse(layout, startStr)
	if err != nil {
		return "", fmt.Errorf("解析开始时间失败: %v", err)
	}

	endTime, err := time.Parse(layout, endStr)
	if err != nil {
		return "", fmt.Errorf("解析结束时间失败: %v", err)
	}

	if endTime.Before(startTime) {
		return "", fmt.Errorf("结束时间不能早于开始时间")
	}

	return formatDuration(endTime.Sub(startTime)), nil
}

func formatDuration(d time.Duration) string {
	totalSeconds := int(d.Seconds())

	hours := totalSeconds / 3600
	minutes := (totalSeconds % 3600) / 60
	seconds := totalSeconds % 60
	milliseconds := int(d.Milliseconds()) % 1000

	if hours > 0 {
		return fmt.Sprintf("%d小时%d分%d秒", hours, minutes, seconds)
	} else if minutes > 0 {
		return fmt.Sprintf("%d分%d秒", minutes, seconds)
	} else if milliseconds > 0 {
		return fmt.Sprintf("%d秒%d毫秒", seconds, milliseconds)
	} else {
		return fmt.Sprintf("%d秒", seconds)
	}
}

// FormatDateTime 格式化时间字符串，去除重复的时区信息
func FormatDateTime(timeStr string) string {
	if timeStr == "" {
		return timeStr
	}

	// 处理重复时区信息的情况： "2025-09-11 00:00:00 +0000 +0000"
	// 这种格式可能是由于XORM处理时区时产生的
	if strings.Contains(timeStr, " +0000 +0000") {
		// 去除重复的时区信息，只保留前面的时间部分
		parts := strings.Split(timeStr, " +0000 +0000")
		if len(parts) > 0 {
			timeStr = strings.TrimSpace(parts[0])
		}
	}

	// 尝试解析时间字符串并重新格式化
	formats := []string{
		"2006-01-02 15:04:05",
		"2006-01-02 15:04:05 -0700",
		"2006-01-02T15:04:05",
		"2006-01-02T15:04:05-07:00",
		"2006-01-02",
	}

	for _, format := range formats {
		if t, err := time.Parse(format, timeStr); err == nil {
			return t.Format("2006-01-02 15:04:05")
		}
	}

	// 如果解析失败，返回原字符串
	return timeStr
}

// FormatTicketTimes 格式化工单的时间字段
func FormatTicketTimes(ticket interface{}) interface{} {
	// 这里可以使用反射来处理不同类型的时间字段格式化
	// 为了简单起见，我们先在具体的服务层处理
	return ticket

}
